import store from "@/store";
import oldAppInfo from "./oldApp";

import type { ImageProps } from "react-native";
import type { WebSocketOperatorOption } from "@anlib/websocket-operator";

type PolyfillInfoType = Pick<ImageProps, "source" | "resizeMode" | "style">;

/**
 * 当前环境, 一般来说可以直接使用 __DEV__, 但是因为需要打包后的APK来测试广告屏
 *  这里加多了一个条件, 这样可以随时切换环境, 而不用修改 __DEV__ 判断
 */
const IS_DEBUG = __DEV__ || false;
// const IS_DEBUG = false;

/** 开发 */
const DEV_PLATFORM_BASE_URL = "https://api.xjfw.top";
const DEV_PROXY_URL = `${DEV_PLATFORM_BASE_URL}/m180`;

// const DEV_PLATFORM_BASE_URL = "http://20.165.8.158:8000";
// const DEV_PROXY_URL = `${DEV_PLATFORM_BASE_URL}/m180`;
///

/** 生产 */
const PROD_PLATFORM_BASE_URL = "http://20.165.8.158:8000";
const PROD_PROXY_URL = `${PROD_PLATFORM_BASE_URL}/m180`;
///

/** websocket地址 */
let websocketUrl: string;
if (IS_DEBUG) {
  // websocketUrl = "ws:1.12.69.30:8763";
  websocketUrl = "ws:1.12.69.30:8764";
  // websocketUrl = "ws:20.165.8.158:8764";
} else {
  websocketUrl = "ws:20.165.8.158:8764";
}

/** 基础URL */
let platformBaseUrl = "";
/** 业务接口URL */
let proxyUrl = "";

if (IS_DEBUG) {
  // 开发
  platformBaseUrl = DEV_PLATFORM_BASE_URL;
  proxyUrl = DEV_PROXY_URL;

  // platformBaseUrl = PROD_PLATFORM_BASE_URL;
  // proxyUrl = PROD_PROXY_URL;
} else {
  // 默认内网生产
  platformBaseUrl = PROD_PLATFORM_BASE_URL;
  proxyUrl = PROD_PROXY_URL;
}

function parseUrlProxy(url: string): string {
  const reduxState = store.getState();

  let ret = url;

  // 业务接口
  const re1 = /^\/api/;
  if (re1.test(url)) {
    ret = url.replace(re1, reduxState.common.proxyUrl);
  }

  // 平台接口, 默认是内网生产和云专线
  const re2 = /^\/platform\/api/;

  // 因为存在自定义接口地址功能, 这里要根据URL判断是否是开发
  // if (reduxState.common.platformBaseUrl === DEV_PLATFORM_BASE_URL) {
  //   // 开发url是存在 /api 的
  //   re2 = /^\/platform/;
  // }

  if (re2.test(url)) {
    ret = url.replace(re2, reduxState.common.platformBaseUrl);
  }

  // console.log("proxy url: ", ret);

  if (!ret.startsWith("http")) {
    console.warn("接口地址异常, 请检查: ", ret);
  }
  return ret;
}

// 全局配置文件
export default {
  IS_DEBUG,
  DEV_PLATFORM_BASE_URL,
  DEV_PROXY_URL,
  PROD_PLATFORM_BASE_URL,
  PROD_PROXY_URL,
  platformBaseUrl,
  proxyUrl,
  websocketUrl,
  /** 代理url函数 */
  proxy: parseUrlProxy,

  /** WebSocket 心跳间隔 */
  webSockeHeartbeatInterval: IS_DEBUG ? 5000 : 30000,
  /** WebSocket 重试间隔 */
  webSockeReconnectInterval: IS_DEBUG ? 5000 : 30000,
  /** WebSocket 心跳数据 */
  webSocketHeartbeatData: JSON.stringify({ cmd: 10000 }),
  /** WebSocket 心跳回应数据 */
  webSocketHeartbeatResultData: JSON.stringify({ cmd: 42000, msg: "成功" }),
  /** 获取 websocket 配置 */
  getWebsocketOpt: function () {
    const reduxState = store.getState();
    const wsUrl = `${reduxState.common.websocketUrl}?cid=${reduxState.index.entryNetworkInfo?.code || ""}`;
    const wsOpt: WebSocketOperatorOption = {
      url: wsUrl,
      heartbeatInterval: this.webSockeHeartbeatInterval,
      heartbeatData: this.webSocketHeartbeatData,
      heartbeatResult: this.webSocketHeartbeatResultData, // 暂时没有用
      reconnectInterval: this.webSockeReconnectInterval,
      maxReconnectionNum: -1, // 无限重试
      // maxReconnectionNum: 10,
      isSpeedUp: false // 不会重试加快
    };
    return wsOpt;
  },

  /** globalMethods, `$success`, `$error`, `$warning`, `$showMessage` 的默认提示时间 */
  messageVisibilityTime: 3000,

  /** 业务系统code */
  bizCode: "m180",

  /** asset:/ 对应 android/app/src/main/assets 目录, 打包时会把对应的资源打包进 apk 中 */
  polyfillInfo: {
    /** 横向 */
    landscape: {
      source: { uri: "asset:/img/polyfill_img_w.png" },
      resizeMode: "contain",
      style: { width: "100%", height: "100%" }
    } as PolyfillInfoType,

    /** 纵向 */
    portrait: {
      source: { uri: "asset:/img/polyfill_img_h.png" },
      resizeMode: "contain",
      style: { width: "100%", height: "100%" }
    } as PolyfillInfoType
  },

  // 0 */1 * * * ?: 每分钟进行一次检查
  // 0 */1 * * *: 每一个小时进行一次检查
  // checkCronExpr: IS_DEBUG ? "0 */1 * * * ?" : "0 */1 * * *",
  checkCronExpr: "0 */1 * * *",

  /** 下载素材的并发数 */
  downMaterialLinit: 5,

  /** 素材轮播的时图片的默认时长, 视频则取视频的时长 */
  materialoopPlayInterval: IS_DEBUG ? 2 * 1000 : 10 * 1000,

  /** 资源目录(日志, 素材, 截图都放在里面) Download 目录下面 */
  resourceDir: "mlkj-ytdc",

  /** 素材分片文件下载的大小, 5M */
  downMaterialChunkSize: 5 * 1024 * 1024,

  /** 直接下载的素材文件大小  */
  directDownloadMaterialSize: 5 * 1024 * 1024,

  /** 开始下载素材时间, 后端限制, 前端不做限制 */
  // startDownMaterialDate: IS_DEBUG ? "08:00:00" : "21:00:00",
  // startDownMaterialDate: "08:00:00",
  startDownMaterialDate: "00:00:00",

  /** 早上9点, 中午12点, 下午2点, 晚上8点 自动同步排期 */
  autoSyncScheduleDate: ["09", "12", "16","20"],

  /** 自动检查离线指令升级的时间 */
  autoUploadAppDate: ["22", "02", "04", "06"],

  /** 服务url */
  serveUrl: {
    /** 管理后台 url */
    businessUrl: IS_DEBUG ? "https://www.xjfw.top/wel/index" : PROD_PLATFORM_BASE_URL.replace(":8000", ":18080"),

    /** mini IO url */
    miniIOUrl: IS_DEBUG ? "http://1.12.69.30:9000/minio/m180" : "http://20.165.8.158:19000/minio/m180",

    /**
     * 本地测试服务地址, 用于在测试环境下, 测试上传文件, 下载素材功能
     */
    localhostServe: "http://192.168.10.102:8900",

    /**
     * 获取上传设备信息url, 内部用到了 redux 这里需要写成函数
     */
    getUploadUrl: () => parseUrlProxy("/api/device/api/upload")
  },

  /** 旧版本app的信息 */
  oldAppInfo
};
